//
//  PYFMDB.h
//  Operations library of sqlite base on FMDB
//
//  Created by terry on 15/3/28.
//  Copyright (c) 2015年 Velda. All rights reserved.
//

#import <Foundation/Foundation.h>

@class FMDatabaseQueue;

@interface MHFMDB : NSObject 
/**
 *  数据库队列
 */
@property (nonatomic,strong) FMDatabaseQueue * queue;
/**
 *  数据库文件名
 */
@property (nonatomic,copy) NSString * dbName;
/**
 *  数据库文件名(锁定)
 */
@property (nonatomic,copy) NSString * dbName_lock;
/**
 *  数据库位置
 */
@property (nonatomic,copy) NSString * dbPath;
/**
 *  数据库位置(锁定)
 */
@property (nonatomic,copy) NSString * dbPath_lock;
/**
 *  最后执行的sql语句
 */
@property (nonatomic,copy) NSString * lastSql;
/**
 *  最后执行的sql语句(锁定)
 */
@property (nonatomic,copy) NSString * lastSql_lock;
/**
 *  数据库表前缀
 */
@property (nonatomic,copy) NSString * prefix;
/**
 *  数据库表前缀(锁定)
 */
@property (nonatomic,copy) NSString * prefix_lock;
/**
 *  要查询出的字段(默认)
 */
@property (nonatomic,strong)  NSArray * fields;
/**
 *  要查询出的字段(锁定)
 */
@property (nonatomic,strong)  NSArray * fields_lock;

/**
 *  要查询出的字段(字符串)
 */
@property (nonatomic,copy)  NSString * fieldsString;

/**
 *  要查询出的字段(数组)
 */
@property (nonatomic,strong)  NSArray * fieldsArray;
/**
 *  当前操作的表名
 */
@property (nonatomic,copy) NSString * currentTableName;
/**
 *  当前操作的表名(锁定)
 */
@property (nonatomic,copy) NSString * currentTableName_lock;
/**
 *  表里的所有字段
 */
@property (nonatomic,strong)  NSDictionary * currentTableFields;
/**
 *  表里的所有字段(锁定)
 */
@property (nonatomic,strong)  NSDictionary * currentTableFields_lock;
/**
 *  要执行的查询条件(锁定)
 */
@property (nonatomic,copy) NSString * where_lock;
@property (nonatomic,copy) NSString * where;

/**
 *  待更新的数据源
 */
@property (nonatomic,strong) id data;
/**
 *  待更新的数据源(锁定)
 */
@property (nonatomic,strong) id data_lock;
/**
 *  Order条件(锁定)
 */
@property (nonatomic,copy) NSString * order_lock;
@property (nonatomic,copy) NSString * order;

/**
 *  group条件(锁定)
 */
@property (nonatomic,copy) NSString * group_lock;

@property (nonatomic,copy) NSString * group;
/**
 *  缓存标识(锁定)
 */
@property (nonatomic,copy) NSString * cacheID_lock;
@property (nonatomic,copy) NSString * cacheID;
/**
 *  查询限制条数(锁定)
 */
@property (nonatomic,copy) NSString * limit_lock;
@property (nonatomic,copy) NSString * limit;

/**
 *  静态方法初始化数据库连接
 */
+ (instancetype)dbWithDbName:(NSString *)dbName;
/**
 *  动态方法初始化数据库连接
 */
- (instancetype)initWithDbName:(NSString *)dbName;

/**
 *  根据字典创建数据库表
 */
- (bool)createTableWithDict:(NSDictionary *)dict tableName:(NSString *)tableName;
/**
 *  执行sql查询
 */
- (NSArray *)excuteQueryWithSql:(NSString *)sql;
/**
 *  执行sql更新
 */
- (bool)excuteUpdateWithSql:(NSString *)sql;

/**
 *  从数组中设置查询的字段信息
 */
- (instancetype)fieldsWithArray:(NSArray *)arr;
/**
 *  从字符串中设置查询的字段信息
 */
- (instancetype)fieldsWithString:(NSString *)str;
/**
 *  从字符串中设置查询的where条件
 */
- (instancetype)whereWithString:(NSString *)str;
/**
 *  从字典中设置查询的where条件
 */
- (instancetype)whereWithDict:(NSDictionary *)dict;
/**
 *  从字符串中设置limit条件
 */
- (instancetype)limitWithString:(NSString *)str;
/**
 *  从数组中设置limit条件
 */
- (instancetype)limitWithArray:(NSArray *)arr;
/**
 *  从start 到 end limit限制
 */
- (instancetype)limitWithStart:(int)start End:(int)end;

/**
 *  从字典添加更新数据源
 */
- (instancetype)dataWithDict:(NSDictionary *)dict;
/**
 *  从数组添加更新数据源
 */
- (instancetype)dataWithArray:(NSArray *)arr;
/**
 *  从JSON中添加更新数据源
 */
- (instancetype)datawithJson:(NSData *)json;

/**
 *  过滤掉非数据库表字段
 */
- (NSDictionary *)filterWithDict:(NSDictionary *)dict;

/**
 *  count统计操作
 */
- (NSNumber *)queryCount;

/**
 *  清除设置条件
 */
- (instancetype)clean;

/**
 *  锁定上次设置条件
 */
- (instancetype)lock;

/**
 *  重置到上次设置的条件
 */
- (instancetype)reset;

/**
 *  重写order get方法
 */
- (NSString *)order;

/**
 *  数据表是否为空
 */
- (BOOL)isEmptyWithTableName:(NSString *)tableName;

#pragma mark - cache 缓存处理方法
/**
 *  将数据缓存入文件
 */
- (BOOL)setObject:(id)data ForCacheKey:(NSString *)cacheKey;

/**
 *  根据缓存键名读取缓存内容
 */
- (id)objectForCacheKey:(NSString *)cacheKey;

#pragma mark - 为字段创建普通索引
- (bool)createIndexWithField:(NSString *)field andTableName:(NSString *)tableName;

@end
